/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestorchat;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Víctor
 */
public class Chat implements EscuchadorConversacion,Runnable {
    protected HashMap<InetAddress,Conversacion> conversaciones;
    protected Conversacion convtmp;
    protected ObjectInputStream flujoEn;
    protected ObjectOutputStream flujoSal;
    protected ServerSocket servidor;
    protected Socket miconexion;
    private String login;
    protected Thread hiloEjecucion;
    
    
    
    public Chat(String login){
         this.login=login;
        System.out.println("Creamos un objeto Chat con el login "+login);
        this.hiloEjecucion=new Thread(this);
        System.out.println("hemos creado el hilo");
       
        this.conversaciones=new HashMap();


        try {
            this.miconexion=new Socket();
            System.out.println("Socket creado");
            this.miconexion.connect(new InetSocketAddress(1221));
            //Conversacion con=new Conversacion(mis,this);
            System.out.println("Socket Conectado ");
             System.out.println("Vamos Intentamos crear los flujos de la conversacion "+this.miconexion.getInetAddress());
           Conversacion con=new Conversacion(this.miconexion,this,this.login);
             //this.flujoSal=new ObjectOutputStream(this.miconexion.getOutputStream());
             //System.out.println("Flujo de salida creado");
            this.conversaciones.put(this.miconexion.getInetAddress(), con);
           con.mandarMsj(new MensajeChat(this.login,0));
        } catch (IOException ex) {
            System.out.println("De momento no hay nadie intentamos ejecutar el servidor de escucha");
           // Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
            try {
            this.servidor=new ServerSocket(1221);
            System.out.println("Escuchando conexiones en el puerto "+this.servidor.getLocalPort());
        } catch (IOException exc) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, exc);
        }
        }
        
    }
    public void escucharMensajes(){
        Collection micol=this.conversaciones.values();
        Iterator it=micol.iterator();
        while(it.hasNext()){
            Conversacion con=(Conversacion)it.next();
            con.escucharMensaje();
        }
    }
    
    @Override
    public void msjRecibido(Conversacion cn, String msj) {
        System.out.println(cn.interlocutor+": "+msj);
    }

    @Override
    public void msjInicio(Conversacion cn) {
        this.conversaciones.put(cn.elsocket.getInetAddress(), cn);
        System.out.println(cn.interlocutor+" ha iniciado conversacion");
    }

    @Override
    public void msjFin(Conversacion cn) {
        this.conversaciones.remove(cn.elsocket.getInetAddress());
        System.out.println(cn.interlocutor+" ha abandonado el chat");
    }

    @Override
    public void run() {
        this.escuchandoPuerto();
        
    }
    public void escuchandoPuerto(){
        try {
            this.miconexion=this.servidor.accept();
            System.out.println("Conexion aceptada ");
            Conversacion con=new Conversacion(this.miconexion,this,this.login);
this.conversaciones.put(this.miconexion.getInetAddress(), con);
            
        } catch (IOException ex) {
            Logger.getLogger(Chat.class.getName()).log(Level.SEVERE, null, ex);
        }
   }

    
    
}
